package casarural;

import java.sql.*;
import java.rmi.*;
import java.util.*;
import java.sql.Date.*;

public final class GestorBD {

	public static final String FUENTE_DATOS = "BDCasasRurales";

//	private static final String url = "jdbc:mysql://localhost/bdcasasrurales";

//	private static final String user = "iso0607";

//	private static final String pass = "iso0607";

	private static GestorBD elGestorBD = new GestorBD();

	private Connection c;

	private Statement s;

	/**
	 * Constructor
	 */
	
	private GestorBD(){
		try{
			Class.forName("com.mysql.jdbc.Driver");
			c= DriverManager.getConnection("jdbc:mysql://localhost/Casa Rural","root","root");
			s=c.createStatement();
		} catch (Exception ex) {
			System.out.println("Error cargando la Fuente de Datos: "
					+ FUENTE_DATOS + "\n\t" + ex.toString());
		}
	}
	
	/*private GestorBD() {
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			c = DriverManager.getConnection("jdbc:odbc:"+FUENTE_DATOS);
			c.setAutoCommit(true);
			s = c.createStatement();
		} catch (Exception ex) {
			System.out.println("Error cargando la Fuente de Datos: "
					+ FUENTE_DATOS + "\n\t" + ex.toString());
		}
	}*/

	/**
	 * Devuelve una instancia del gestor de la BD
	 *
	 * @param Ninguno
	 * @return GestorBD
	 */
	public static GestorBD getInstance() {
		return elGestorBD;
	}
	/**
	 * Selecciona reservas entre las fechas que se le indican
	 *
	 * @param Dia de inicio, dia de fin y numero de casas
	 * @return Vector de objetos Oferta
	 */
	public Vector seleccionarReservas(java.sql.Date diaIni,
			java.sql.Date diaFin, int numCasa)
			throws NoSePuedeReservarException

	{
		Vector vectorReservas = new Vector();

		try {
			String consulta = "SELECT NumOferta,DiaIni,DiaFin,Precio FROM oferta WHERE NumReserva is null AND  NumCasa = "
					+ numCasa
					+ " AND DiaFin >= #"
					+ diaIni
					+ "# AND DiaIni <= #" + diaFin + "#";
			ResultSet rs = s.executeQuery(consulta);
			while (rs.next()) {
				String numeroOferta = rs.getString("NumOferta");
				java.sql.Date diaFinal = rs.getDate("DiaFin");
				java.sql.Date diaInicio = rs.getDate("DiaIni");
				float precio = rs.getFloat("Precio");
				Oferta res = new Oferta();
				res.setNumOferta(numeroOferta);
				res.setDiaIni(diaInicio);
				res.setDiaFin(diaFinal);
				res.setPrecio(precio);
				vectorReservas.addElement(res);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (!(vectorReservas.elements()).hasMoreElements())
			throw new NoSePuedeReservarException(
					"La casa no se encuentra disponible estos dias");
		return vectorReservas;
	}

	/**
	 * Dado un numero de casa selecciona al propietario de esa casa
	 *
	 * @param Numero de casa
	 * @return El propietario
	 */
	public Propietario seleccionarPropietario(int numCasa)

	{
		Propietario p = new Propietario();
		try {
			// String consulta = "SELECT P.NumCuentaCorriente FROM Propietario
			// P, CasaRural C WHERE C.Propietario=P.CuentaSistema AND C.NumCasa
			// ="+numCasa;
			String consulta = "SELECT P.NumCuentaCorriente FROM propietario P, casarural C WHERE C.Propietario=P.CuentaSistema AND C.NumCasa ="
					+ numCasa;
			ResultSet rs = s.executeQuery(consulta);
			if (rs.next()) {
				String str = new String(rs.getString("NumCuentaCorriente"));
				p.setNumCuentaCorriente(str);
			}
		} catch (Exception ex) {
			System.out.println("1" + ex.toString());
		}
		return p;
	}

	/****** ASIGNAR DISPONIBILIDAD *******/
	
	/**
	 * Obtiene una lista con los n�meros de casa de los propietarios
	 * 
	 * @param cuentaSistema : Identificador de propietario en el sistema
	 * @return vector con los n�meros de casas del propietario
	 */
	
	public Vector seleccionarCasas(String cuentaSistema)

	{
		CallableStatement cs;
		Vector vectorCasas = new Vector();
		try {
			String proced = "{CALL selCasas ( ? )}";
			cs = c.prepareCall(proced);
			cs.setString(1, cuentaSistema);
			ResultSet rs = cs.executeQuery();
			while (rs.next()) {
				vectorCasas.addElement(rs.getInt("NumCasa"));
			}
		} catch (SQLException e) {
			System.out.println("2" + e.toString());
		}
		return vectorCasas;

	}
	
	/**
	 * Comprueba si hay alguna oferta reservada que se solape con la oferta introducida
	 * 
	 * @param FechaInicio : Fecha en la que comienza la oferta a comprobar
	 * @param FechaFin : Fecha en la que finaliza la oferta a comprobar
	 * @param CodigoCasa : Codigo de la casa de la oferta a comprobar
	 * @return True si hay alguna oferta reservada que se solape con la oferta introducida y False en caso contrario
	 */
	
	public boolean estaReservado(java.sql.Date FechaInicio, java.sql.Date FechaFin, int CodigoCasa){
		
		try {
			CallableStatement Reservado;
			String aux="{CALL estaReservado(?,?,?,?)}";
			Reservado = c.prepareCall(aux);
			
			Reservado.setDate(1, FechaInicio);
			Reservado.setDate(2, FechaFin);
			Reservado.setInt(3, CodigoCasa);
			
			Reservado.registerOutParameter(4, Types.BOOLEAN);
			Reservado.executeQuery();
			
			return Reservado.getBoolean(4);
		} catch (SQLException e) {
			System.out.println("2" + e.toString());
			return true;
		}
	}
	
	/**
	 * Inserta una oferta en la base de datos
	 * 
	 * @param oferta : Oferta a insertar en la base de datos
	 */
	public void insertarOferta(Oferta oferta){
		try {
			CallableStatement ofer;
			String aux="{CALL insertarOferta(?,?,?,?)}";
			ofer = c.prepareCall(aux);
			
			ofer.setDate(1, oferta.getDiaIni());
			ofer.setDate(2, oferta.getDiaFin());
			ofer.setFloat(3, oferta.getPrecio());
			ofer.setInt(4, oferta.getNumCasa());
			
			ofer.executeQuery();
		} catch (SQLException e) {
			System.out.println("2" + e.toString());
		}
		
	}
	
	/****** FIN ASIGNAR DISPONIBILIDAD *******/

	/**
	 * Devuelve las todas las casas
	 *
	 * @param Ninguno
	 * @return Vector de objetos de la clase Casa
	 */
	public Vector seleccionarCasas()

	{
		Vector vectorCasas = new Vector();
		try {

			// String consulta="SELECT NumCasa FROM CasaRural";
			String consulta = "SELECT NumCasa FROM casarural";
			ResultSet rs = s.executeQuery(consulta);
			while (rs.next()) {
				int nc = rs.getInt("NumCasa");
				Casa ca = new Casa();
				ca.setNumCasa(nc);
				vectorCasas.addElement(ca);
			}
		} catch (Exception ex) {
			System.out.println("3" + ex.toString());
		}
		return vectorCasas;
	}

	/**
	 * Devuelve el resultado de las ofertas que interesan, seg�n las
	 * restricciones de fechas, precio y dem�s, que opcionalmente pueda haber
	 * introducido.
	 *
	 * Para la realizaci�n de la consulta, se ha decidido generarla a medida que
	 * se descubren los par�metros introducidos por el usuario. De esta manera,
	 * puede capturarse cualquiera de las posibilidades introducidas por el
	 * usuario, de una vez en una sola consulta.
	 *
	 * @param numDormitorios, m�nimo n�mero de dormitorios.
	 * @param numBa�os, m�nimo n�mero de ba�os.
	 * @param diaIni, fecha de inicio de para la b�squeda de ofertas.
	 * @param diaIni, fecha de finalizaci�n de para la b�squeda de ofertas.
	 * @param precio, precio m�ximo de las ofertas a priori.
	 * @param numMinDias, n�mero m�nimo de d�as para la estancia.
	 * @param orden, ordenados por precio o por n�mero de d�as.
	 * @return Vector, un vector con las ofertas interesantes para el usuario.
	 */
	public Vector seleccionarCasasDorWC(int numDormitorios, int numBanos,
			java.sql.Date diaIni, java.sql.Date diaFin, float precio,
			int numMinDias, boolean orden)

	{

		String banos = "";
		String dormi = "";
		String dias = "";
		String sOrden = "";
		String precioMax = "";

		/*
		 * En caso de que el usuario haya a�adido alg�n n�mero m�nimo de
		 * dormitorios, dicha restricci�n se a�ade a la consulta. Para ello,
		 * creamos la restricci�n.
		 */
		if (numDormitorios != 0) {
			dormi = " AND NumDormitorios >= " + numDormitorios;
		}
		// float Fdias = ((diaFin.getTime() - diaIni.getTime())/(1000*3600*24));
		// int numDias = (int) Fdias;

		/*
		 * En caso de que el usuario haya a�adido alg�n n�mero m�nimo de ba�os,
		 * dicha restricci�n se a�ade a la consulta. Para ello, creamos la
		 * restricci�n.
		 */
		if (numBanos != 0) {
			banos = " AND NumBa�os >=" + numBanos;
		}
		/*
		 * En caso de que el usuario haya a�adido un precio m�ximo, dicha
		 * restricci�n se a�ade a la consulta. Para ello, creamos la
		 * restricci�n.
		 */
		if (precio != 0) {
			precioMax = " AND Precio <=" + precio;
		}

		/*
		 * Se calcula el n�mero de d�as, para comparar la duraci�n de la
		 * estancia dentro de la misma consulta.
		 */
		if (numMinDias != 0) {
			dias = " AND ((DiaFin - DiaIni)/1000000) >=" + numMinDias;
		}

		/*
		 * En funci�n de lo que escoja el usuario, se ordenar� el resultado de
		 * la consulta.
		 */
		if (orden) {
			sOrden = " ORDER BY Precio ASC";
		} else {
			sOrden = " ORDER BY numDias DESC";
		}
		//precio,diafin,diaini,numcasa,numoferta
		String consulta = "SELECT *, ((DiaFin - DiaIni)/1000000) as numDias FROM casarural C,oferta O "
				+ " WHERE C.NumCasa = O.NumCasa AND numreserva is null "
				+ banos
				+ dormi
				+ " AND DiaIni >= #"
				+ diaIni
				+ "# AND Diafin <= #" + diaFin + "# " + precioMax + dias;
		Vector ofertas = new Vector();
		// Creamos la consulta resultante de la uni�n de todas las piezas.
		try {
			consulta = consulta + sOrden;
			System.out.println(consulta);
			ResultSet rs = s.executeQuery(consulta );
			// Se crea la oferta resultado, y se pasa al vector de ofertas.
			while (rs.next()) {
				Oferta of = new Oferta();
				of.setPrecio(rs.getFloat("precio"));
				of.setDiaFin(rs.getDate("diafin"));
				of.setDiaIni(rs.getDate("diaini"));
				of.setNumCasa(rs.getInt("NumCasa"));
				Integer i = new Integer(rs.getInt("Numoferta"));
				of.setNumOferta(i.toString());
				ofertas.add(of);
			}

		} catch (Exception ex) {
			System.out.println("4" + ex.toString());
		}

		return ofertas;
	}
	/**
	 * Fecha devuelve una fecha tomada de formato tres datos en formato num�rico.
	 *
	 * @param year, entero que hace referencia al a�o
	 * @param month, entero que hace referencia al mes
	 * @param day, entero que hace referencia al d�a
	 * @return Date, la misma fecha en formato fecha (clase Date).
	 */
	private static java.sql.Date fecha(int year,int month,int day){
		return new java.sql.Date((new GregorianCalendar(year, month-1, day)).getTime().getTime());
	}
		/**
		 * Selecciona las ofertas entre las fechas dadas para un numero de casa
		 *
		 * @param Diade inicio, dia de fin y numero de casa
		 *
		 * @return Vector de objetos de la clase Oferta
		 */
		public Vector seleccionarOfertas(java.sql.Date diaIni,
				java.sql.Date diaFin, int numCasa)

		{
			Vector vectorOfertas = new Vector();
			try {
				
				String consulta = "SELECT NumOferta,DiaIni,DiaFin,Precio,NumReserva FROM oferta WHERE "
						+ "DiaFin >= #"
						+ diaFin
						+ "# AND DiaIni <= #"
						+ diaIni
						+ "# AND DiaFin >= #"
						+ diaIni
						+ "# AND DiaIni <= #"
						+ diaFin
						+ "# AND NumCasa = " + numCasa;
System.out.println(consulta);
				ResultSet rs = s.executeQuery(consulta);
				while (rs.next()) {
					String nOferta = rs.getString("NumOferta");
					java.sql.Date dIni = rs.getDate("DiaIni");
					java.sql.Date dFin = rs.getDate("DiaFin");
					float pr = rs.getFloat("Precio");
					String nRes = rs.getString("NumReserva");
					Oferta of = new Oferta();
					of.setDiaFin(dFin);
					of.setDiaIni(dIni);
					of.setNumOferta(nOferta);
					of.setNumReserva(nRes);
					of.setPrecio(pr);
					vectorOfertas.addElement(of);

				}
			} catch (Exception ex) {
				System.out.println("5" + ex.toString());
			}

			return vectorOfertas;
		}
		/**
		 * Realiza la reserva en forma de transaccion
		 *
		 * @param Vector de Strings numeros de oferta, numero de reserva, telefono y
		 * precio
		 * @return Ninguno
		 */
		public void transaccionDeReserva(Vector reservasTotales, String numReserva,
				String numTfnoReserva, float precioTotal) {
			try {

				// Connection
				// d=DriverManager.getConnection("jdbc:odbc:BDCasasRurales");
				Connection auxC = DriverManager.getConnection("jdbc:odbc:"+FUENTE_DATOS);
				auxC.setAutoCommit(false);
				Statement auxS = auxC.createStatement();
				java.sql.Date diadehoy = new java.sql.Date(System
						.currentTimeMillis());
				// String consulta1 ="INSERT INTO
				// RESERVA(NumReserva,Pagado,Fecha,NumTfno,PrecioTotal) VALUES
				// ('"+numReserva+"',no,#"+diadehoy+"#,'"+numTfnoReserva+"',"+precioTotal+")";
				String consulta1 = "INSERT INTO reserva(NumReserva,Pagado,Fecha,NumTfno,PrecioTotal) VALUES ('"
						+ numReserva
						+ "',no,#"
						+ diadehoy
						+ "#,'"
						+ numTfnoReserva
						+ "'," + precioTotal + ")";
				auxS.executeUpdate(consulta1);
				Enumeration enumera = reservasTotales.elements();
				while (enumera.hasMoreElements()) {
					String nOferta = (String) enumera.nextElement();
					// String consulta = "UPDATE OFERTA SET NumReserva
					// ='"+numReserva+"' WHERE NumOferta
					// ="+Integer.valueOf(nOferta).intValue();
					String consulta = "UPDATE oferta SET NumReserva ='"
							+ numReserva + "' WHERE NumOferta ="
							+ Integer.valueOf(nOferta).intValue();
					s.executeUpdate(consulta);
				}
				auxC.commit();
				auxC.close();
			} catch (Exception ex) {
				System.out.println("6" + ex.toString());
			}
		}
		/**
		 * Realiza una trasaccion de ofertas
		 *
		 * @param Vector de Strings numeros de oferta, dia de inicio, dia de fin,
		 * numero de la primera oferta, numero de la ultima oferta,precio
		 * y numero de casa
		 * @return Ninguno
		 */
		public void transaccionDeOfertas(Vector todasLasOfertasIncluidas,
				java.sql.Date diaIni, java.sql.Date diaFin, String numOfePrimera,
				String numOfeUltima, float precio, int numCasa) {
			try {
				// Connection
				// d=DriverManager.getConnection("jdbc:odbc:BDCasasRurales");
				Connection auxC = DriverManager.getConnection("jdbc:odbc:"+FUENTE_DATOS);
				auxC.setAutoCommit(false);
				Statement auxS = auxC.createStatement();
				String consulta;
				Enumeration enumera = todasLasOfertasIncluidas.elements();
				if (!numOfePrimera.equals(numOfeUltima)) {
					if (!numOfePrimera.equals("cero")) {
						// String consulta1="SELECT Precio,DiaIni,DiaFin FROM OFERTA
						// WHERE
						// NumOferta="+Integer.valueOf(numOfePrimera).intValue();
						String consulta1 = "SELECT Precio,DiaIni,DiaFin FROM oferta WHERE NumOferta="
								+ Integer.valueOf(numOfePrimera).intValue();
						ResultSet rs1 = auxS.executeQuery(consulta1);
						rs1.next();
						float prPrim = rs1.getFloat("Precio");
						java.sql.Date dIniPrim = rs1.getDate("DiaIni");
						java.sql.Date dFinPrim = rs1.getDate("DiaFin");
						int numeroDiasPrim = (int) ((dFinPrim.getTime() - dIniPrim
								.getTime()) / (1000 * 3600 * 24)) + 1;
						float precioPorDiaPrim = prPrim / (int) numeroDiasPrim;
						int numDiasAntes = (int) ((diaIni.getTime() - dIniPrim
								.getTime()) / (1000 * 3600 * 24));
						int nuevoPrecioPrim = (int) (numDiasAntes * precioPorDiaPrim);
						java.sql.Date diaIniNuevo = new java.sql.Date(diaIni
								.getTime() - 1000 * 3600 * 24);
						if (diaIniNuevo.getTime() >= dIniPrim.getTime()) {
							// String consultaA1 = "UPDATE OFERTA SET DiaFin =
							// #"+diaIniNuevo+"#, Precio = "+nuevoPrecioPrim+" WHERE
							// NumOferta
							// ="+Integer.valueOf(numOfePrimera).intValue();
							String consultaA1 = "UPDATE oferta SET DiaFin = #"
									+ diaIniNuevo + "#, Precio = "
									+ nuevoPrecioPrim + " WHERE NumOferta ="
									+ Integer.valueOf(numOfePrimera).intValue();
							auxS.executeUpdate(consultaA1);
						} else {
							// String consultaA3 = "DELETE FROM OFERTA WHERE
							// NumOferta
							// ="+Integer.valueOf(numOfePrimera).intValue();
							String consultaA3 = "DELETE FROM oferta WHERE NumOferta ="
									+ Integer.valueOf(numOfePrimera).intValue();
							auxS.executeUpdate(consultaA3);
						}
					}
					if (!numOfeUltima.equals("cero")) {
						// String consulta2="SELECT Precio,DiaIni,DiaFin FROM OFERTA
						// WHERE
						// NumOferta="+Integer.valueOf(numOfeUltima).intValue();
						String consulta2 = "SELECT Precio,DiaIni,DiaFin FROM oferta WHERE NumOferta="
								+ Integer.valueOf(numOfeUltima).intValue();
						ResultSet rs2 = auxS.executeQuery(consulta2);
						rs2.next();
						float prUlti = rs2.getFloat("Precio");
						java.sql.Date dIniUlti = rs2.getDate("DiaIni");
						java.sql.Date dFinUlti = rs2.getDate("DiaFin");
						int numeroDiasUlti = (int) ((dFinUlti.getTime() - dIniUlti
								.getTime()) / (1000 * 3600 * 24)) + 1;
						float precioPorDiaUlti = prUlti / (int) numeroDiasUlti;
						int numDiasDespues = (int) ((dFinUlti.getTime() - diaFin
								.getTime()) / (1000 * 3600 * 24));
						int nuevoPrecioUlti = (int) (numDiasDespues * precioPorDiaUlti);
						java.sql.Date diaFinNuevo = new java.sql.Date(diaFin
								.getTime() + 1000 * 3600 * 24);
						if (dFinUlti.getTime() >= diaFinNuevo.getTime()) {
							// String consultaA2 = "UPDATE OFERTA SET DiaIni =
							// #"+diaFinNuevo+"#, Precio = '"+nuevoPrecioUlti+"'
							// WHERE NumOferta
							// ="+Integer.valueOf(numOfeUltima).intValue();
							String consultaA2 = "UPDATE oferta SET DiaIni = #"
									+ diaFinNuevo + "#, Precio = '"
									+ nuevoPrecioUlti + "' WHERE NumOferta ="
									+ Integer.valueOf(numOfeUltima).intValue();
							auxS.executeUpdate(consultaA2);
						} else {
							// String consultaA4 = "DELETE FROM OFERTA WHERE
							// NumOferta
							// ="+Integer.valueOf(numOfeUltima).intValue();
							String consultaA4 = "DELETE FROM oferta WHERE NumOferta ="
									+ Integer.valueOf(numOfeUltima).intValue();
							auxS.executeUpdate(consultaA4);
						}
					}
				} else if (!numOfePrimera.equals("cero")) {
					// String consulta1="SELECT Precio,DiaIni,DiaFin FROM OFERTA
					// WHERE NumOferta="+Integer.valueOf(numOfePrimera).intValue();
					String consulta1 = "SELECT Precio,DiaIni,DiaFin FROM oferta WHERE NumOferta="
							+ Integer.valueOf(numOfePrimera).intValue();
					ResultSet rs1 = auxS.executeQuery(consulta1);
					rs1.next();
					float prPrim = rs1.getFloat("Precio");
					java.sql.Date dIniPrim = rs1.getDate("DiaIni");
					java.sql.Date dFinPrim = rs1.getDate("DiaFin");
					int numeroDiasPrim = (int) ((dFinPrim.getTime() - dIniPrim
							.getTime()) / (1000 * 3600 * 24)) + 1;
					float precioPorDiaPrim = prPrim / (int) numeroDiasPrim;
					int numDiasAntes = (int) ((diaIni.getTime() - dIniPrim
							.getTime()) / (1000 * 3600 * 24));
					int numDiasDespues = (int) ((dFinPrim.getTime() - diaFin
							.getTime()) / (1000 * 3600 * 24));
					int nuevoPrecioPrim = (int) (numDiasAntes * precioPorDiaPrim);
					int nuevoPrecioUlti = (int) (numDiasDespues * precioPorDiaPrim);
					java.sql.Date diaIniNuevo = new java.sql.Date(
							diaIni.getTime() - 1000 * 3600 * 24);
					java.sql.Date diaFinNuevo = new java.sql.Date(
							diaFin.getTime() + 1000 * 3600 * 24);
					if (diaIniNuevo.getTime() >= dIniPrim.getTime()) {
						// String consultaA5 = "UPDATE OFERTA SET DiaFin =
						// #"+diaIniNuevo+"#, Precio = "+nuevoPrecioPrim+" WHERE
						// NumOferta ="+Integer.valueOf(numOfePrimera).intValue();
						String consultaA5 = "UPDATE oferta SET DiaFin = #"
								+ diaIniNuevo + "#, Precio = " + nuevoPrecioPrim
								+ " WHERE NumOferta ="
								+ Integer.valueOf(numOfePrimera).intValue();
						auxS.executeUpdate(consultaA5);
					} else {
						// String consultaA6 = "DELETE FROM OFERTA WHERE NumOferta
						// ="+Integer.valueOf(numOfePrimera).intValue();
						String consultaA6 = "DELETE FROM oferta WHERE NumOferta ="
								+ Integer.valueOf(numOfePrimera).intValue();
						auxS.executeUpdate(consultaA6);
					}
					if (dFinPrim.getTime() >= diaFinNuevo.getTime()) {
						// String consulta2="INSERT INTO OFERTA
						// (DiaIni,DiaFin,Precio,NumCasa)"+"VALUES(#"+diaFinNuevo+"#,#"+dFinPrim+"#,"+nuevoPrecioUlti+","+numCasa+")";
						String consulta2 = "INSERT INTO oferta (DiaIni,DiaFin,Precio,NumCasa)"
								+ "VALUES(#"
								+ diaFinNuevo
								+ "#,#"
								+ dFinPrim
								+ "#," + nuevoPrecioUlti + "," + numCasa + ")";
						auxS.executeUpdate(consulta2);
					}
				}
				String nOferta;
				while (enumera.hasMoreElements()) {
					nOferta = (String) enumera.nextElement();
					// consulta = "DELETE FROM OFERTA WHERE NumOferta
					// ="+Integer.valueOf(nOferta).intValue();
					consulta = "DELETE FROM oferta WHERE NumOferta ="
							+ Integer.valueOf(nOferta).intValue();
					auxS.executeUpdate(consulta);
				}
				// String consultaI1 = "INSERT INTO OFERTA
				// (DiaIni,DiaFin,Precio,NumCasa)"+"VALUES(#"+diaIni+"#,#"+diaFin+"#,"+precio+","+numCasa+")";
				String consultaI1 = "INSERT INTO oferta (DiaIni,DiaFin,Precio,NumCasa)"
						+ "VALUES(#"
						+ diaIni
						+ "#,#"
						+ diaFin
						+ "#,"
						+ precio
						+ "," + numCasa + ")";
				auxS.executeUpdate(consultaI1);
				auxC.commit();
				auxC.close();
			} catch (Exception ex) {
				System.out.println("7" + ex.toString());
				ex.printStackTrace();
			}
		}
		/**
		 * M�todo que obtiene el n�mero de habitaciones y de ba�os dado el id de la casa
		 *
		 * @param numCasa, id de la casa a consultar
		 * @return vector que contiene por un lado, el n�mero de habitaciones, y por el otro
		 * el n�mero de ba�os de dicha casa
		 */
		public Vector numHabitacionesnumBanos(int numCasa) {
			Vector v = new Vector();
			try {
				String consulta = "SELECT numDormitorios,numBa�os FROM casarural WHERE numCasa="
						+ numCasa;

				ResultSet rs = s.executeQuery(consulta);

				if (rs.next()) {
					int dormitorios = rs.getInt(1);
					int banos = rs.getInt(2);
					v.addElement(String.valueOf(dormitorios));
					v.addElement(String.valueOf(banos));
				}

			} catch (Exception ex) {
				System.out.println("8" + "error al contar habitaciones y ba�os(GestorBD)");
			}
			return v;
		}
		/**
		 * M�todo que obtiene el n�mero de camas de una casa. Las camas dobles cuentan por dos.
		 * El m�todo devolver� un �nico n�mero con el total de camas de dicha casa.
		 *
		 * @param numCasa, identificador de la casa
		 * @return el n�mero de camas de la casa
		 */
		public int camas(int numCasa) {
			int numcamas = 0;
			try
			//
			{// String consulta="SELECT
				// SUM(NumCamasSencillas)+SUM(NumCamasDobles)*2 as tamano FROM
				// Dormitorio WHERE NumCasa="+numCasa+" GROUP BY NumCasa";
				String consulta = "SELECT SUM(NumCamasSencillas)+SUM(NumCamasDobles)*2 as tamano FROM dormitorio WHERE NumCasa="
						+ numCasa + " GROUP BY NumCasa";

				ResultSet rs = s.executeQuery(consulta);

				if (rs.next())
					numcamas = rs.getInt(1);

			} catch (Exception ex) {
				System.out.println("error en camas (GestorBD)");
			}
			;
			return numcamas;
		}
		//NUEVOS
		
		/**
		 * 
		 * M�todo que devuelve en un Vector las reservas, ordenadas por el n�mero de reserva,
		 * cuya fecha de entrada est�n entre las fechas de inicio y fin indicadas en los par�metros correspondientes
		 * 
		 * @param diaIni, fecha de inicio de la b�squeda
		 * @param diaFin, fecha de fin de la b�squeda
		 * @return Vector con las reservas cuya fecha de entrada est� entre las indicadas
		 */
		public Vector<Reserva> seleccionarReservas (java.sql.Date diaIni, java.sql.Date diaFin){
			Vector<Reserva> reservas = new Vector<Reserva>();
				try {
					ResultSet rs = s.executeQuery("Select distinct(CInt(Oferta.NumReserva)) as NumReserva, PrecioTotal, NumCasa  FROM Oferta INNER JOIN Reserva ON Oferta.numReserva=Reserva.numReserva"
								+" WHERE Oferta.NumReserva is not null AND DiaIni<=#"+diaFin+"# AND DiaIni>=#"+diaIni+"#"
								+" AND DiaFin>=#"+diaIni+"# AND DiaFin<=#"+diaFin+"#");				
					Reserva res;
					String numR;
					int casa;
					float precio;
					while(rs.next()){
						numR = rs.getString("NumReserva");
						casa = rs.getInt("NumCasa");
						precio = rs.getFloat("PrecioTotal");
						res = new Reserva(numR,casa,precio);
						reservas.add(res);
					}
				} catch (SQLException e) {
					System.out.println("ERROR: "+e.toString());
					e.printStackTrace();
				}
			return reservas;
		}
		
		/**
		 * Devuelve las ofertas correspondientes a una reserva
		 * 
		 * @param numReserva
		 * @return Vector con las ofertas correspondientes a una reserva
		 */
		public Vector<Oferta> seleccionarOfertas (String numReserva){
			Vector<Oferta> ofertas = new Vector<Oferta>();
			Oferta oferta;
			String numO, numR;
			java.sql.Date diaIni,diaFin;
			float precio;
			try {
				ResultSet rs = s.executeQuery("SELECT NumOferta, NumReserva, DiaIni, DiaFin, Precio FROM Oferta WHERE NumReserva='"+numReserva+"' ORDER BY DiaIni ASC");
				while(rs.next()){
					numO = rs.getString("NumOferta");
					numR = rs.getString("NumReserva");
					diaIni = rs.getDate("DiaIni");
					diaFin = rs.getDate("DiaFin");
					precio = rs.getFloat("Precio");
					oferta = new Oferta();
					oferta.setDiaFin(diaFin);
					oferta.setDiaIni(diaIni);
					oferta.setNumOferta(numO);
					oferta.setNumReserva(numR);
					oferta.setPrecio(precio);
					ofertas.add(oferta);
				}
			} catch (SQLException e) {
				System.out.println("ERROR: "+e.toString());
				e.printStackTrace();
			}
			return ofertas;
		}
		
		/**
		 * Dado un n�mero de reserva lo elimina de la base de datos y deja disponibles todas las ofertas correspondientes
		 * Todo dentro de una transacci�n.
		 * 
		 * @param numR, n�mero de la reserva
		 * @param ofertas, vector de ofertas asociadas a la reserva
		 */
		public void anularReserva(String numR, Vector<Oferta> ofertas, Vector<Oferta> ofAnular) throws SQLException{

			try {
				Connection auxC = DriverManager.getConnection("jdbc:odbc:"+FUENTE_DATOS);
				try{
					auxC.setAutoCommit(false);
					Statement auxS = auxC.createStatement();
					auxS.executeUpdate("DELETE * FROM Reserva WHERE NumReserva='"+numR+"'");
					for(int i=0;i<ofertas.size();i++){
						auxS.executeUpdate("UPDATE Oferta SET NumReserva='' WHERE NumOferta="+Integer.parseInt(ofertas.elementAt(i).getNumOferta()));
					}
					for(int i=0;i<ofAnular.size();i++){
						auxS.executeUpdate("UPDATE Oferta SET NumReserva='-1' WHERE NumOferta="+Integer.parseInt(ofAnular.elementAt(i).getNumOferta()));
					}
					auxC.commit();
					auxC.close();
				}
				catch(SQLException e1){
					auxC.rollback();
					auxC.close();
					throw new SQLException();
				}
			} catch (SQLException e) {
				System.out.println("ERROR: "+e.toString());
				e.printStackTrace();
				throw new SQLException();
			}
		}
	}
